package br.com.foxinline.servlet;

import br.com.foxinline.enums.EstadoCivil;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.Coordenada;
import br.com.foxinline.modelo.Imovel;
import br.com.foxinline.modelo.Proprietario;
import br.com.foxinline.servico.AnexoServico;
import br.com.foxinline.servico.ImovelServico;
import br.com.foxinline.servico.ProprietarioServico;
import br.com.foxinline.util.Base64;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.CoordinateConversion;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.json.JSONException;
import org.primefaces.json.JSONObject;

/**
 *
 * @author roniere
 */
@WebServlet(name = "receiverUtilMobileServlet", urlPatterns = "/receiverUtilMobileServlet/*")
public class ReceiverUtilMobileServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    @EJB
    private AnexoServico anexoServico;
    @EJB
    private ImovelServico imovelServico;
    @EJB
    private ProprietarioServico proprietarioServico;

    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
//        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        String requestData = processRequest(request);

//        System.err.println("Dados: " + requestData + "+");

        requestData = requestData.replace("\"description\":", "\"nome\":");
        requestData = requestData.replace("\"filebyte\":", "\"arquivo\":");
        requestData = requestData.replace("\"type\":", "\"tipo\":");

        requestData = requestData.replace("\"conjuge\":", "\"conjugeMobile\":");
        requestData = requestData.replace("\"estadoCivil\":", "\"estadoCivilMobile\":");


        Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy").create();

        JSONObject jSONObject = null;

        List<Proprietario> proprietarios = null;
        /**
         * INQUILINOS
         */
        List<Proprietario> inquilinos = new ArrayList<Proprietario>();

        try {
            jSONObject = new JSONObject(requestData);
        } catch (JSONException ex) {
            System.err.println(ex);
            Logger.getLogger(ReceiverUtilMobileServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

        try {

            if (jSONObject.get("comando") != null) {

                Imovel imovel = gson.fromJson(requestData, Imovel.class);

                imovel.setId(null);

                if (imovel.getProprietarios() != null) {

                    proprietarios = new ArrayList<Proprietario>();

                    for (Proprietario proprietario : imovel.getProprietarios()) {
                        boolean proprietarioImovel = true;
                        if (!proprietario.isProprietario()) {
                            //proprietarioImovel = false;
                        }

                        //ZERA O ID QUEM VEM DO ATLAS MOBILE
                        proprietario.setId(null);

                        proprietario.setTipoDocumento(TipoDocumento.CPF);

                        /**
                         * mock, para satisfazer campo de cpf/cnpj do mobile
                         */
                        if (proprietario.getCpf() != null && !proprietario.getCpf().isEmpty()
                                && proprietario.getCpf().length() == 14) {
                            proprietario.setNomeFantasia(proprietario.getNome());
                            proprietario.setNome(null);
                            proprietario.setCnpj(proprietario.getCpf());
                            proprietario.setTipoDocumento(TipoDocumento.CNPJ);
                            proprietario.setCpf(null);
                        }

                        if (proprietario.getCpf() != null && !proprietario.getCpf().isEmpty()) {

                            Proprietario p = proprietarioServico.existProprietario(TipoDocumento.CPF,
                                    proprietario.getCpf());

                            //ATUALIZA DADOS DO PROPRIETARIO
                            if (p != null) {

                                if ((p.getRg() == null || p.getRg().isEmpty()) && proprietario.getRg() != null) {
                                    p.setRg(proprietario.getRg());
                                }

                                if ((p.getOrgaoEmissor() == null || p.getOrgaoEmissor().isEmpty()) && proprietario.getOrgaoEmissor() != null) {
                                    p.setOrgaoEmissor(proprietario.getOrgaoEmissor());
                                }

                                if (p.getDataNasc() == null && proprietario.getDataNasc() != null) {
                                    p.setDataNasc(proprietario.getDataNasc());
                                }

                                if ((p.getProfissao() == null || p.getProfissao().isEmpty()) && proprietario.getProfissao() != null) {
                                    p.setProfissao(proprietario.getProfissao());
                                }

                                if ((p.getTelefone() == null || p.getTelefone().isEmpty()) && proprietario.getTelefone() != null) {
                                    p.setTelefone(proprietario.getTelefone());
                                }

                                if (p.getConjuge() == null && proprietario.getConjugeMobile() != null) {
                                    p.setConjugeMobile(proprietario.getConjugeMobile());
                                }

                                if (p.getConjuge() == null && proprietario.getCpfConjuge() != null) {
                                    p.setCpfConjuge(proprietario.getCpfConjuge());
                                }

                                if (p.getEstadoCivil() == null) {
                                    p.setEstadoCivil(getEstadoCivil(proprietario.getEstadoCivilMobile()));
                                }

                                proprietario = p;
                            }
                        }

                        if (proprietario.getCnpj() != null && !proprietario.getCnpj().isEmpty()) {

                            Proprietario p = proprietarioServico.existProprietario(TipoDocumento.CNPJ,
                                    proprietario.getCnpj());

                            if (p != null) {
                                proprietario = p;
                            }
                        }

                        if (proprietario.getEstadoCivilMobile() != null) {
                            proprietario.setEstadoCivil(getEstadoCivil(proprietario.getEstadoCivilMobile()));
                        }

                        //CONJUGE
                        if (proprietario.getConjugeMobile() != null && !proprietario.getConjugeMobile().isEmpty()
                                && proprietario.getCpfConjuge() != null && !proprietario.getCpfConjuge().isEmpty()) {

                            //PESQUISA CONJUGE NA BASE
                            Proprietario p = proprietarioServico.existProprietario(TipoDocumento.CPF, proprietario.getCpfConjuge());

                            //CASO NÃO EXISTA CONJUGE NO BD, CRIA UM NOVO PROPRIETARIO
                            if (p == null) {
                                p = new Proprietario();
                                p.setTipoDocumento(TipoDocumento.CPF);
                                p.setNome(proprietario.getConjugeMobile());
                                p.setCpf(proprietario.getCpfConjuge());
                                p.setRg(proprietario.getRgConjuge());
                                p.setProfissaoConjuge(proprietario.getProfissaoConjuge());
                                proprietarioServico.salvar(p);
                            }

                            proprietario.setConjuge(p);
                        }

                        //TODO CORRIGIR.
                        //TRANSPOSTA OS DADOS TRANSIENT DO IMOVEL PARA O PROPRIETARIO
                        /*
                         * CAMPOS tempomoradia tempomoradiamunicipio
                         * bolsafamilia valorbolsafamilia minhacasaminhavida
                         * composicaofamiliar rendafamiliar
                         */
                        if (imovel.getTempoMoradia() != null && proprietario.getTempoMoradia() == null) {
                            proprietario.setTempoMoradia(imovel.getTempoMoradia());
                        }
                        if (imovel.getTempoMoradiaMunicipio() != null && proprietario.getTempoMoradiaMunicipio() == null) {
                            proprietario.setTempoMoradiaMunicipio(imovel.getTempoMoradiaMunicipio());
                        }
                        if (imovel.getBolsaFamilia() != null && proprietario.getBolsaFamilia() == null) {
                            proprietario.setBolsaFamilia(imovel.getBolsaFamilia());
                        }
                        if (imovel.getMinhaCasaMinhaVida() != null && proprietario.getMinhaCasaMinhaVida() == null) {
                            proprietario.setMinhaCasaMinhaVida(imovel.getMinhaCasaMinhaVida());
                        }
                        if (imovel.getComposicaoFamiliar() != null && proprietario.getComposicaoFamiliar() == null) {
                            proprietario.setComposicaoFamiliar(imovel.getComposicaoFamiliar());
                        }
                        if (imovel.getRendaFamiliar() != null && proprietario.getRendaFamiliar() == null) {
                            proprietario.setRendaFamiliar(imovel.getRendaFamiliar());
                        }

                        if (proprietario.getId() == null) {
                            proprietarioServico.salvar(proprietario);
                        } else {
                            proprietarioServico.update(proprietario);
                        }

                        if (proprietarioImovel) {
                            proprietarios.add(proprietario);
                        } else {
                            inquilinos.add(proprietario);
                        }
                    }

                    imovel.setProprietarios(proprietarios);
                }
                if (imovel.getCoordX() != null) {
                    CoordinateConversion cc = new CoordinateConversion();
                    Coordenada c = new Coordenada();
                    //"24 M 212951 9673551"
                    String coord = cc.latLon2UTM(imovel.getCoordX(), imovel.getCoordY());

                    c.setLat(imovel.getCoordX());
                    c.setLog(imovel.getCoordY());
                    c.setConvN("" + coord.split(" ")[2]);
                    c.setConvE(coord.split(" ")[0] + "" + coord.split(" ")[3]);

                    List<Coordenada> coordenadas = new ArrayList<Coordenada>();
                    coordenadas.add(c);
                    imovel.setCoordenadas(coordenadas);
                }
                if (imovel.getDimensoes() != null) {
                    imovel.getDimensoes().setId(null);
                }
                if (imovel.getEnderecoImovel() != null) {
                    imovel.getEnderecoImovel().setId(null);
                }
                if (imovel.getEnderecoCorrespondencia() != null) {
                    imovel.getEnderecoCorrespondencia().setId(null);
                }

                if (imovel.getAnnex() != null) {

                    for (Anexo anexo : imovel.getAnnex()) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(ReceiverUtilMobileServlet.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss-SSSS");
                        String data = dateFormat.format(new Date());

                        anexo.setNome(data + anexo.getNome());
                    }
                }

                if (imovel.getAnnexCroquis() != null) {

                    for (Anexo anexo : imovel.getAnnexCroquis()) {
                        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy-HH-mm-ss-SSSS");
                        String data = dateFormat.format(new Date());

                        anexo.setNome(data + anexo.getNome());
                    }
                }

                /**
                 * FALTA SETAR O INQUILINO
                 */
//                imovel.setProprietarios(proprietarios);
                imovelServico.save(imovel);

                return;
            } else {
                System.err.println("ANEXO");
            }

        } catch (JSONException ex) {
            System.err.println(ex);
            try {

//                System.err.println("ANNEXO === ");
//                System.err.println("" + requestData);
                Anexo annex = gson.fromJson(requestData, Anexo.class);

                Anexo a = anexoServico.findUUID(annex.getCod());

                String nome = Caracter.substituirEspacos(a.getNome());
                nome = Caracter.removerAcentos(nome);
                nome = Caracter.removeCaracterIgnoraPonto(nome);

                a.setNome(nome.concat(".jpg"));
                a.setContent(annex.getContent());
                a.setArquivo(Base64.decode(annex.getContent()));

                anexoServico.update(a);

            } catch (Exception e) {
                System.err.println(e);
                Logger.getLogger(ReceiverUtilMobileServlet.class.getName()).log(Level.SEVERE, null, e);
            }
        }

    }

    private String processRequest(HttpServletRequest request) {
        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null) {
                jb.append(line);
            }
        } catch (Exception e) {
            System.err.println(e);
        }

        return jb.toString();

    }

    public EstadoCivil getEstadoCivil(String nome) {
        if (nome != null) {
            if (nome.equals("Solteiro(a)")) {
                return EstadoCivil.SOLTEIRO;
            } else if (nome.equals("Casado(a)")) {
                return EstadoCivil.CASADO;
            } else if (nome.equals("Divorciado(a)")) {
                return EstadoCivil.DIVORCIADO;
            } else if (nome.equals("Viúvo(a)")) {
                return EstadoCivil.VIUVO;
            } else if (nome.equals("União estável")) {
                return EstadoCivil.UNIAO_ESTAVEL;
            } else if (nome.equals("Separado judicialmente")) {
                return EstadoCivil.SEPARADO_JUDICIALMETE;
            } else {
                return EstadoCivil.OUTRO;
            }
        }
        return null;
    }
}
